package com.itheima.service.impl;

import com.itheima.dao.AccountDao;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * TODO:事务设计：
 *      1.找到具备原子性的业务操作 ： 转出+转入
 *      2.在这之前开启事务
 *      3.业务操作成功提交，失败回滚
 *
 * TOSO:一：转账案例引入了事务
 *      1.问题：就是事务操作代码和业务代码耦合了，不利于扩展
 *             （如果还有业务方法需要事务，就还需要再次编写事务代码）
 *      2.解决：AOP
 *          1）AccountService3Impl ： 把AccountService2Impl中事务代码都删除了
 *          2）切面类TxAdvice
 */
@Service
public class AccountService3Impl implements AccountService {
    @Autowired
    private AccountDao dao;

    /**
     *
     * @param outId
     * @param inId
     * @param money
     *
     * 如果有异常通知，业务方法不能自己catch异常！！！
     *  1.方案一：不要try..catch
     *  2.方案二：可以try..catch，但是在catch里再抛出异常
     */
    @Override
    public void transfer(int outId, int inId, double money) {
        //TODO：2.业务操作
        dao.outMoney(outId, money);
        //可能在转账过程中发生意外: 转出执行,转入还未执行
//            int i = 1/0;
        dao.inMoney(inId, money);
    }

    public void transfer2(){
        System.out.println("需要事务的操作！");
    }
}
